#include "stm32f10x.h" 
#include "freertos.h"
#include "task.h"

#include <string.h>  // 包含strcmp()的声明
#include <stdint.h>  // 保证uint8_t类型定义

#include "LED_Control.h"
#include "USART_SendString.h"
#include "USART_RecvString.h"

volatile LED_State current_state = LED_OFF;

/**
 * @brief  g_LEDMode用于指示LED当前工作的模式
 * @param  
 * @retval 
 */
void LED_Init(void){
    // 1 开启GPIOA外设时钟（A0属于PA0）
    RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE);

    // 2 配置PA0为推挽输出
    GPIO_InitTypeDef GPIO_InitStruct;   			// GPIO_InitStruct是一个习惯命名
    GPIO_InitStruct.GPIO_Pin = LED_PIN;     		// 初始化的引脚是A0引脚
    GPIO_InitStruct.GPIO_Mode = GPIO_Mode_Out_PP; 	// 引脚的工作模式是推挽输出模式
    GPIO_InitStruct.GPIO_Speed = GPIO_Speed_2MHz;   // 工作速度为低速2MHz 
    GPIO_Init(LED_PORT, &GPIO_InitStruct);			// 调用GPIO_Init, 完成PA0引脚初始化
	
	// 3 初始状态熄灭LED
	GPIO_SetBits(LED_PORT, LED_PIN);
}

// simple-edition
void LED_Control(const char* recv_str) {
    if(strcmp(recv_str, "OFF") == 0){
		current_state = LED_OFF;
		GPIO_SetBits(LED_PORT, LED_PIN);			// 关灯
		USART1_SendString("LED OFF\r\n");
	}
	else if(strcmp(recv_str, "ON") == 0){
		current_state = LED_ON;
		GPIO_ResetBits(LED_PORT, LED_PIN);			// 开灯
		USART1_SendString("LED ON\r\n");
	}
	else if(strcmp(recv_str, "BLINK") == 0){
		current_state = LED_BLINK;
		//LED_BlinkControl();							// 直接执行会导致阻塞
        USART1_SendString("Blinking\r\n");
	}
	else{
		current_state = LED_ERROR;
		GPIO_ResetBits(LED_PORT, LED_PIN);			// 关灯
		USART1_SendString("Invalid command!\r\n");
	}
}

void LED_BlinkControl(void){
	TickType_t now = xTaskGetTickCount();
	
	if(now - last_toggle_time >= pdMS_TO_TICKS(500)){
		GPIO_WriteBit(LED_PORT, LED_PIN, (GPIO_ReadOutputDataBit(LED_PORT, LED_PIN) == Bit_SET) ? Bit_RESET : Bit_SET);
		last_toggle_time = now;         	   // 更新最后一次翻转时间
		
		if(++blink_count >= 20){
			current_state = LED_OFF;			// 停止闪烁
			GPIO_ResetBits(LED_PORT, LED_PIN);	// 关闭LED
		}
	}
}
